//
//  instr.h
//  ltlbmc
//
//  Created by GD Huang on 5/22/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#ifndef ltlbmc_instr_h
#define ltlbmc_instr_h


#include "lval.h"
#include "exp.h"
#include "astVisitor.h"
#include "fundec.h"



namespace cilast {
    
    
    class lval;  
    class fundec;
    
    
    class instr : public OCamlObject {
    public:
        
        virtual int accept(astVisitor*);
    };
    
    class Set : public instr {
    public:    
        lval* mlval;
        exp* mexp;
        location* mlocation;
        
        int accept(astVisitor*);
        
    };
    
    class Call : public instr {
    public:    
        //the following members are in cil
        lval* mlval;
        exp* mexp;
        std::vector<exp*> mexps;
        location* mlocation;
        
        //the following members are added in cilast
    private:
    public:
        
        
        int accept(astVisitor*);
        
    };
    
    
    class Asm : public instr {
    public:
        int accept(astVisitor*);
        
    };
    
}

#endif
